/**
    Copyright (C) 2011  Alexander Vollmer

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package org.jefb.aop;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

//@Aspect
public class LazyInitializerAspect {

	Logger logger = LoggerFactory.getLogger(LazyInitializerAspect.class);

	@Pointcut(value = "execution(* org.jefb.entity.*.get*(..))")
	public void anyGetter() {
	}

//	@SuppressWarnings({ "unchecked", "rawtypes" })
//	@Transactional(propagation = Propagation.REQUIRED)
//	@Around("anyGetter() && @annotation(org.jefb.annotations.LazyInit)")
//	public Object aroundAdvice(ProceedingJoinPoint call) throws Throwable {
//
//		Object result = call.proceed();
//
//		if (result instanceof Set) {
//			Set resutlSet = (Set) result;
//			Set newContainer = new HashSet();
//			newContainer.addAll(resutlSet);
//			return newContainer;
//		}
//
//		if (result instanceof List) {
//			List resultList = (List) result;
//			List newContainer = new ArrayList();
//			newContainer.addAll(resultList);
//			return newContainer;
//		}
//
//		return result;
//	}
}
